﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.ServiceModel;
using System.Text;

namespace Anagramme.Contracts
{
    /// <summary>
    /// Contrat pour le service de jeu
    /// </summary>
    [ServiceContract(SessionMode = SessionMode.Required, CallbackContract = typeof(IGameServiceCallback))]
    public interface IGameService
    {
        /// <summary>
        /// Authentifie le client sur le service
        /// </summary>
        /// <param name="token">Jeton de sécurité</param>
        /// <remarks>Le jeton de sécurité est obtenu lors de la connexion au service de lobby</remarks>
        [OperationContract(IsOneWay = true, IsInitiating = true)]
        void Authenticate(Guid token);

        /// <summary>
        /// Envoie d'une demande pour récupérer les informations sur l'équipe Bleue
        /// </summary>
        [OperationContract(IsOneWay = true)]
        void RequestGameBlueTeamInfos();

        /// <summary>
        /// Envoie d'une demande d'extinction du serveur
        /// </summary>
        /// <remarks>Nécessite d'être le maitre du lobby</remarks>
        [OperationContract(IsOneWay = true)]
        void RequestGameClose();

        /// <summary>
        /// Envoie d'une demande pour récupérer les informations sur la partie
        /// </summary>
        [OperationContract(IsOneWay = true)]
        void RequestGameInfos();

        /// <summary>
        /// Indique au serveur que le joueur quitte la partie
        /// </summary>
        [OperationContract(IsOneWay = true)]
        void RequestGameLeave();

        /// <summary>
        /// Indique au serveur que le jeu à été chargé sur le client
        /// </summary>
        [OperationContract(IsOneWay = true)]
        void RequestGameLoaded();

        /// <summary>
        /// Envoie d'une demande pour récupérer les informations sur l'équipe Rouge
        /// </summary>
        [OperationContract(IsOneWay = true)]
        void RequestGameRedTeamInfos();

        /// <summary>
        /// Envoie d'une demande de soumission d'un mot
        /// </summary>
        /// <param name="wordNumber">Index du mot à contrôler</param>
        /// <param name="word">Mot à comparer</param>
        /// <remarks>La comparaison des mots n'est ni sensible à la casse, ni aux accents</remarks>
        [OperationContract(IsOneWay = true)]
        void RequestGameSubmitWord(int wordNumber, string word);
    }
}
